<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lang="zh" xml:lang="zh">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>指南: 关联</title>
<meta content="Guideline" name="uma.type">
<meta content="association" name="uma.name">
<meta content="关联" name="uma.presentationName">
<meta name="element_type" content="other">
<meta content="description" name="filetype">
<meta name="role" content="">
<link type="text/css" href="./../../../css/default.css" rel="StyleSheet">
<script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageResource.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageSection.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageSubSection.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageToolbar.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/contentPage.js"></script><script language="JavaScript" type="text/javascript">
					var backPath = './../../../';
					var imgPath = './../../../images/';
					var nodeInfo=[{view: "view:_LVCagP5WEdmAzesbYywanQ", path: ["_LVCagP5WEdmAzesbYywanQ", "_zRigkAILEdq-_NKqZM1EhA", "_qwxC8N7YEdmjRZts2c4ZjQ", "{DB21F5EF-810B-4994-B120-79FA8774FA9D}", "5.540135518285335E-305"]}, {view: "view:_LVCagP5WEdmAzesbYywanQ", path: ["_LVCagP5WEdmAzesbYywanQ", "_zRigkAILEdq-_NKqZM1EhA", "_QV4x0AISEdqTna4sZVFRow", "_kjFBYN7HEdm8G6yT7-Wdqw", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "5.540135518285335E-305"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_f6_YwN7DEdmsEI4YDGX2ag", "_qwxC8N7YEdmjRZts2c4ZjQ", "{DB21F5EF-810B-4994-B120-79FA8774FA9D}", "5.540135518285335E-305"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_Jvt1cAIaEdqEutyfYo0quQ", "_EOvXUN7HEdm8G6yT7-Wdqw", "_kjFBYN7HEdm8G6yT7-Wdqw", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "5.540135518285335E-305"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_Jvt1cAIaEdqEutyfYo0quQ", "_jijhYAIaEdqEutyfYo0quQ", "_mTMIkN7REdmjRZts2c4ZjQ", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "5.540135518285335E-305"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_jD8dUAIbEdqEutyfYo0quQ", "_2ClPcDIcEdqDs_9ORT1Rig", "5.540135518285335E-305"]}];
					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
				</script>
</head>
<body>
<div id="breadcrumbs"></div>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td valign="top"><a name="Top"></a>
<div id="page-guid" value="5.540135518285335E-305"></div>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td nowrap="true" class="pageTitle">指南：关联</td><td width="100%">
<div id="contentPageToolbar" align="right"></div>
</td>
</tr>
</table>
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td class="pageTitleSeparator"><img height="1" title="" alt="" src="./../../../images/shim.gif"></td>
</tr>
</table>
<div class="overview">
<table cellpadding="0" cellspacing="0" border="0" width="97%">
<tr>
<td width="50"><img title="" alt="" src="./../../../images/guidance.gif"></td><td>
<table cellpadding="0" cellspacing="0" border="0" class="overviewTable">
<tr>
<td valign="top">关联表示对象之间的结构关系。本指南说明如何使用此关系。</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">关系</div>
<div class="sectionContent">
<table cellpadding="0" cellspacing="0" border="0" class="sectionTable">
<tr valign="top">
<th scope="row" class="sectionTableHeading">相关元素</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../core.base_rup/roles/rup_designer_BA8DE74E.html" guid="{DB21F5EF-810B-4994-B120-79FA8774FA9D}">设计人员</a>
</li>
<li>
<a href="./../../../core.base_rup/tasks/class_design_98F20FF9.html" guid="{27AE0601-2E95-4A6A-8EB3-0A4BA8E5626B}">类设计</a>
</li>
<li>
<a href="./../../../core.base_rup/workproducts/rup_design_model_2830034D.html" guid="{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}">设计模型</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">主要描述</div>
<div class="sectionContent">
<table cellpadding="0" cellspacing="0" border="0" class="sectionTable">
<tr valign="top">
<td class="sectionTableSingleCell"><a id="Top" name="Top"></a><a id="XE_association_classes__guidelines_for" name="XE_association_classes__guidelines_for" class="index" key="关联类" text="指南"></a><a id="XE_association__guidelines_for" name="XE_association__guidelines_for"></a> 
<h3>
    <a id="XE_class__associations _recommendations_for_use_of" name="XE_class__associations _recommendations_for_use_of" class="index" key="class" text="associations recommendations for use of"></a><a id="Associations" name="Associations">关联</a>
</h3>
<p>
    <a id="XE_boundary_class__associations,_general_guidelines" name="XE_boundary_class__associations,_general_guidelines"></a>关联代表具有不同类的对象之间的结构关系；它们代表存在一段时间的两个或更多类的实例之间的连接。将其与瞬态链接（例如，仅存在一个操作的持续时间）相对比。后者的情况可以改为使用协作建模，其中这些链接仅存在于特定的受限环境中。
</p>
<p>
    <a id="XE_association__recommendations_for_using" name="XE_association__recommendations_for_using"></a>您可以使用关联来显示对象了解其他对象。有时，对象之间必须彼此引用以能够交互，例如，彼此发送消息；因此，在一些情况下，关联可能是从时序图或通信图中的交互模式中得出的。
</p>
<h3>
    <a id="XE_association__naming" name="XE_association__naming"></a><a id="Names" name="Names">关联名称</a>
</h3>
<p>
    多数关联是二元的（在恰好两个类之间存在），并用作连接类符号对的可靠路径。可能关联有名称，或者可能关联<a href="#Roles">角色</a>有名称。角色名称更好，因为它们传达更多信息。在只有一个角色可以命名的情况下，角色仍然比关联名称好，只要预计该关联是单向的（从与该角色名称相关联的对象开始）。
</p>
<p>
    关联通常在存在足够信息以正确命名角色前的分析期间命名。在使用关联名称的地方，关联名称应该反映关系的目的，且应当是一个动词短语。关联的名称放置在关联路径上或邻近关联路径。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在 ATM
    中，<b>现金抽屉</b>提供<b>现金分发机</b>分发的钱。为了使<b>现金分发机</b>能分发钱款，它必须保持引用<b>现金抽屉</b>对象；类似地，如果发现<b>现金抽屉</b>没有钱了，则必须通知<b>现金分发机</b>对象，所以
    <b>现金抽屉</b>必须保持引用<b>现金分发机</b>。 关联对这种引用建模。
</p>
<p class="picturecenter" align="center">
    <img height="93" alt="示例关联名称" src="./../../../core.base_rup/guidances/guidelines/resources/assoc0.gif" width="415" />
</p>
<p class="picturetext">
    <b>现金分发机</b>和<b>现金抽屉</b>之间的关联，命名为<b>供应价值</b>。
</p>
<p>
    关联名称如果选择不当，会令人迷惑和误解。以下示例说明了好的命名和坏的命名。在第一个图中，使用的是关联名称，尽管它们在语法上正确（使用动词短语），但它们不能传达关于这种关系的很多信息。在第二个图中，使用的是角色名称，它们更多地传达了关联中的参与的性质。
</p>
<p align="center">
    <img height="471" alt="附带文本中描述的图。" src="./../../../core.base_rup/guidances/guidelines/resources/md_asso3.gif" width="401" border="0" />
</p>
<p class="picturetext">
    关联名称和角色名称的使用好坏的示例
</p>
<h3>
    <a id="XE_roles_on_associations__guidelines_for" name="XE_roles_on_associations__guidelines_for" class="index" key="关联中的角色（roles on associations）" text="指南"></a><a id="Roles" name="Roles">角色</a>
</h3>
<p>
    关联的每一端都是一个<b>角色</b>，指定一个类在关联中所扮演的角色<b>。</b>每个角色必须有名称，与类相对的角色名称必须是唯一的。角色名称应该是一个名词，表示被关联对象与关联对象相关的角色。例如，在与<b>课程</b>的关联中，
    <b>教师</b>的适当角色名称可以是<b>讲师</b>；请避免诸如“<b>有</b>”和“<b>包含</b>”之类的名称，因为它们不能添加关于这些类之间的关系的任何信息。
</p>
<p>
    请注意使用关联名称和角色名称是互相排斥的：不能同时使用关联名称<b>和</b>角色名称。角色名称比关联名称更好，没有足够信息以正确命名角色的情况下除外（这种情况在分析中很常见；在设计角色名称中应始终使用）。缺乏好的角色名称意味着模型不完整或格式不好。
</p>
<p>
    角色名称放置在关联线末端旁边。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    考虑订单输入系统中类之间的关系。一个客户可以有两种不同的地址：一个发送账单的地址，若干发送订单的地址。结果，我们在客户和地址之间有<b>两</b>个关联，如下所示。这些关联是使用被关联的地址对客户所扮演的<b>角色</b>来标注的。
</p>
<p class="picturecenter" align="center">
    <img height="342" alt="关联示例" src="./../../../core.base_rup/guidances/guidelines/resources/assoc1.gif" width="349" />
</p>
<p class="picturetext">
    <b>客户</b>、<b>地址</b>和<b>订单</b>之间的关联，同时显示角色名称和多重性
</p>
<h3>
    <a id="XE_multiplicity_for_associations__guidelines_for" name="XE_multiplicity_for_associations__guidelines_for" class="index" key="关联的多重性（multiplicity for associations）" text="指南"></a><a id="XE_association__multiplicity" name="XE_association__multiplicity"></a><a id="Multiplicity" name="Multiplicity">多重性</a>
</h3>
<p>
    对于每个角色，您都可以指定其类的<b>多重性</b>，即该类的多少个对象可以与另一个类的一个对象相关联。使用角色上的文本表达式表示多重性。
    表达式是一个逗号分隔的整数范围列表。一个整数范围由一个整数（下限）、两个圆点和一个整数（上限）来表示；单个整数也是有效的范围，而符号 '*'
    表示“许多”，即对象的数量不受限制。符号“*”自身等于“0..*”，即任何数字（包括空）；这是缺省值。可选的标量角色具有多重性 0..1。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在上例中，显示了订单和客户之间关联以及客户和地址之间关联的多重性。解释该图 － 它显示的是：订单必须有相关联的客户（在客户一端，多重性为 1..1），但是客户可能没有任何订单（在订单一端，多重性为
    0..*）。而且，一个客户具有一个开票地址，但有一个或多个装运地址。为了减少标记混乱，如果省略多重性，则可以假设多重性为 1..1。
</p>
<h3>
    <a id="XE_roles_on_associations__navigability_property" name="XE_roles_on_associations__navigability_property"></a><a id="XE_navigability_on_associations__guidelines_for" name="XE_navigability_on_associations__guidelines_for" class="index" key="关联的可导航性（navigability on associations）" text="指南"></a><a id="XE_association__navigability" name="XE_association__navigability"></a><a id="Navigability" name="Navigability">可导航性</a>
</h3>
<p>
    角色的<b>可导航性</b>属性表示可以通过关联关系从关联类导航到目标类上。这可以若干方式实施：通过直接对象引用、通过关联数组、散列表，或允许一个对象引用另一个对象的任何其他实施技术。可导航性由一个开放的箭头表示，该箭头放置在关联线靠近目标类（要导航至的类）的目标端。可导航性属性的缺省值为
    <b>true</b>。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在订单输入示例中，<b>订单</b>与<b>客户</b>之间可以进行<b>双向</b>导航：<b>订单</b>必须知道是哪一位<b>客户</b>下的<b>订单</b>，<b>客户</b>必须知道他下了哪些<b>订单</b>。当不显示任何箭头时，则假设该关联在两个方向都可以导航。
</p>
<p class="example">
    在<b>客户</b>与<b>地址</b>之间的关联关系中，<b>客户</b>必须知道其<b>地址</b>，但<b>地址</b>却不知道哪些<b>客户</b>（或其他类，因为许多事物都有地址）与该地址相关联。结果，关联关系中<b>客户</b>一端的可导航形属性被关闭，图示如下：
</p>
<p class="picturecenter" align="center">
    <img height="298" alt="关联的可导航性示例" src="./../../../core.base_rup/guidances/guidelines/resources/assoc2.gif" width="337" />
</p>
<p class="picturetext">
    更新过的订单输入系统类，显示关联的可导航性。
</p>
<h3>
    <a id="XE_association__self-associations" name="XE_association__self-associations"></a><a id="Self-Associations" name="Self-Associations">自关联</a>
</h3>
<p>
    有时，一个类与其自身有关联。这不一定意味着该类的实例与其自身有关联；更常见的是，意味着该类的一个实例与同一类的其他实例有关联。在自我关联的情况下，角色名称对于区分该关联的目的是必要的。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    请考虑涉及类<b>雇员</b>的以下自关联关系：
</p>
<p class="picturetext" align="center">
    <img height="123" alt="自关联的示例" src="./../../../core.base_rup/guidances/guidelines/resources/assoc4.gif" width="170" />
</p>
<p class="example">
    在这种情况下，一个雇员可能与其他雇员有关联；如果他们确实与其他雇员有关联，则他们是经理，其他雇员是他们的职员。该关联在两个方向都可以导航，因为雇员知道他们的经理，经理知道其职员。
</p>
<h3>
    <a id="Multiple Associations" name="Multiple Associations">多重关联</a>
</h3>
<p>
    在类之间得出两个关联意味着对象相关两次；一个给定的类可以通过每个关联链接到不同的对象。每个关联都是独立的，并通过角色名称区别。如上所示，客户可以与同一个类的不同实例有关联，每一个关联都具有不同的角色名称。
</p>
<h3>
    <a id="XE_roles_on_associations__order_property" name="XE_roles_on_associations__order_property"></a><a id="Ordered Roles" name="Ordered Roles">为角色排序</a>
</h3>
<p>
    当关联的多重性大于 1
    时，被关联的实例会被<b>排序</b>。角色的<b>排序</b>属性表示参与关联的那些实例要进行排序。在缺省情况下，它们并不进行排序。模型并未指定<b>如何</b>对排序进行维护；用于对排序后的关联进行更新的操作必须指定更新元素的插入位置。
</p>
<h3>
    <a id="XE_links__guidelines_for" name="XE_links__guidelines_for" class="index" key="链接（links）" text="指南"></a><a id="Links" name="Links">链接</a>
</h3>
<p>
    关联的单个实例称为<b>链接</b>；因而链接是实例之间的一种关系。消息可以通过链接发送，链接可以表示对象之间的引用和聚集。 请参阅<a class="elementLinkWithUserText" href="./../../../core.base_rup/guidances/guidelines/communication_diagram_FFFEA1B5.html" guid="4.5194432001390347E-305">技术：通信图</a>以了解更多信息。
</p>
<h3>
    <a id="XE_control_class__associations_recommendations_for_use_of" name="XE_control_class__associations_recommendations_for_use_of"></a><a id="XE_association__association_classes" name="XE_association__association_classes"></a><a id="Association Classes" name="Association Classes">关联类</a>
</h3>
<p>
    <b>关联类</b>是一种也有类属性（例如属性、操作和关联）的关联。它是通过从关联路径到保存关联的属性、操作和关联的类符号之间画一条虚线而显示的。这些属性、操作和关联适用于原关联本身。关联中的每个链接都有所示的属性。关联类最常见的使用是协调多对多关系（请参阅以下示例）。原则上，关联的名称和类的名称应该相同，但是如果需要的话，也允许不同的名称。退化的关联类仅包含该关联的属性；在这种情况下您可以省略关联类名称以不再强调其不同。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    扩展前面的雇员示例，考虑一个雇员（职员）为另一个雇员（经理）工作的情况。经理对职员执行定期评估，反映他们在一个具体时间段的绩效。
</p>
<p class="example">
    这种评估不可能是经理或职员单方面的属性，但是我们可以将该信息与关联本身关联起来，如下所示：
</p>
<p class="picturecenter" align="center">
    <img height="214" alt="关联类的示例" src="./../../../core.base_rup/guidances/guidelines/resources/assoc5.gif" width="192" />
</p>
<p class="picturetext">
    关联类<b>评估</b>获取与关联本身相关的信息
</p>
<h3>
    <a id="XE_association__qualified_associations" name="XE_association__qualified_associations"></a><a id="Qualified Associations" name="Qualified Associations">限定关联</a>
</h3>
<p>
    限定词被用于进一步约束和定义与另一个实例相关联的一组实例；一个对象和一个限定词值标识该关联的一组唯一的对象，形成<b>组合键</b>。限定通常减少了相对角色的多重性；净多重性显示与第一个类和给定限定词值相关联的相关类的实例的数目。限定词被表示为关联中与限定类连接的一端的小方框。它们是关联（而不是类）的一部分。一个限定词方框可能包含多个限定词值；限定是基于整个值列表的。
    <b>限定关联</b>是关联属性的一种变体。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    考虑对<b>订单商品</b>和<b>产品</b>之间关联的以下改进：一个<b>订单商品</b>与订购的<b>产品</b>有关联。每个订单商品引用一个并且仅引用一个产品，而一个产品可能在许多订单商品上被订购。通过使用限定词<b>产品代码</b>限定该关联，我们还指出每个产品具有一个唯一的产品代码，而
    <b>订单商品</b>则是通过此代码与<b>产品</b>相关联的。
</p>
<p class="picturecenter" align="center">
    <img height="207" alt="限定关联" src="./../../../core.base_rup/guidances/guidelines/resources/assoc6.gif" width="138" />
</p>
<p class="picturetext">
    <b>订单商品</b>和<b>产品</b>之间的关联有限定词<b>产品代码</b>。
</p>
<h3>
    <a id="XE_N-ary_associations__guidelines_for" name="XE_N-ary_associations__guidelines_for" class="index" key="多元关联关系（N-ary associations）" text="指南"></a><a id="XE_entity_class__associations_recommendations_for_use_of" name="XE_entity_class__associations_recommendations_for_use_of"></a><a id="XE_association__N-ary_associations" name="XE_association__N-ary_associations"></a><a id="N-ary Associations" name="N-ary Associations">多元关联关系</a>
</h3>
<p>
    多元关联是在三个或更多类之间的关联，其中一个类可以出现多次。多元关联被表示为到每个参与类都有一个关联路径的大菱形。这是关联的传统实体关系模型符号。为了更简洁，二元形式不画有菱形，因为它们是实际模型中存在的大多数关联。
    多元关联非常少见，也可以通过将它们提升为类来建模。多元关联也可以有一个关联类；这通过从菱形到类符号画一条虚线来显示。角色可能具有角色名称，但是多重性更复杂，最好通过列出备选关键字来指定。如果给定多重性，多重性代表对应于给定元组的其他
    N-1 个对象的实例的数目。多数对多元关联的使用可以通过使用限定关联或关联类来消除。它们也可以由普通类替换，尽管这会丢失以下约束：即对给定元组的参与对象只能有一个链接。
</p><br />
<br /></td>
</tr>
</table>
</div>
<table cellpadding="0" cellspacing="0" border="0" class="copyright">
<tr>
<td class="copyright"><p>
    &copy; &nbsp;Copyright IBM Corp.&nbsp;1987, 2006. &nbsp;All Rights Reserved.
</p></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<script language="JavaScript" type="text/javascript">
				contentPage.onload();
			</script>
</html>
